/**********************************************************************
* 文件名：MqClient.cpp
* 创建日期：2021-06-16 13:15
* 作者：李志勇
* 邮箱：18771909050@163.com
* 版权声明：Copyright (c) 2021 zhiyongli Technology (China) Limited.
* All rights reserved.
* 修改记录:
***********************************************************************/
#ifndef MQMODEL_H
#define MQMODEL_H

#include <QStringList>
#include <qamqpexchange.h>
#include <qamqpqueue.h>

class MqModel
{
    using ExchangeType =  QAmqpExchange::ExchangeType;
    using ExchangeOption = QAmqpExchange::ExchangeOption;
    using ExchangeOptions = QAmqpExchange::ExchangeOptions;

    using QueueOption = QAmqpQueue::QueueOption;
    using QueueOptions = QAmqpQueue::QueueOptions;
public:
    MqModel();

    void Save(const QString& file_name);
    void Read(const QString& file_name);

    QString m_host_name{"127.0.0.1"}; ///< 服务器IP
    quint16 m_port{5672}; ///< 服务器端口号
    QString m_virtual_host{"/"}; ///< 虚拟主机
    QString m_user_name{"guest"}; ///< 用户名
    QString m_password{"guest"}; ///< 密码

    /** 生产者将消息发送给交换器的路由键(路由规则)，通过指定routingkey来决定消息流向哪里
    * routingkey需要与bindingkey联合使用才能最终生效
    */
    QStringList m_routing_key{"myawesome.routing.key"};

    ///< 关联交换器与队列的绑定键，这样RabbitMQ就知道如何正确地将消息路由到队列中去
    QStringList m_binding_key{{"myawesome.routing.key"}, {"com.*"}};

    QString m_exchange_name{"my_exchanage_name"}; ///< 交换器名称

    /** 交换器类型 fanout、direct、topic、headers
    * fanout：会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中
    * direct: rotingkey 与bindingkey完全匹配，例如上述routing_key 与 binding_key默认值完全一致
    * topic: 模糊匹配，bindingkey只要满足rotingkey规则就可以了，详见《RabbitMQ实战指南》2.1.4
    * headers: 忽略不计
    */
    ExchangeType m_exchange_type{/*ExchangeType::Direct*/ExchangeType::Topic};

    ///< Durable: 持久化可以将交换器存盘，在服务器重启的时候不会丢失相关信息
    /// AutoDelete: 队列或交换器和这个交换器新绑定，之前绑定的都将删除
    ExchangeOptions m_exchange_option{ExchangeOption::Durable|ExchangeOption::AutoDelete};

    QString m_queue_name{"my_queue_name"}; ///< 队列名称

    ///< Durable: 持久化可以将队列存盘，在服务器重启的时候不会丢失队列相关信息
    /// AutoDelete: 是否设置为排他队列，设置了不允许同名队列出现，并且客户端断开会自动删除队列，适用于一个客户端同时发送和接受
    QueueOptions m_queue_option{QueueOption::Durable/*|QueueOption::AutoDelete*/};
};

#endif // MQMODEL_H
